package baza;

import java.sql.*;

import java.util.*;

import util.*;
import klient.*;
import uslugi.*;

import javax.swing.JOptionPane;

import klient.Klient;

public class BazaDanych {
	
	private String sterownik;
	private String url;
	private Properties props;
	
	public BazaDanych(){
		sterownik = "org.postgresql.Driver";
		url = "jdbc:postgresql://localhost:8432/bank";
		props = new Properties();
		props.setProperty("user","postgres");
		props.setProperty("password","start");
		this.podlaczDoBazy();
	}
	
	public int obliczSume(String atrybut, String tabela){
		int s = 0;
		Connection con = null;
		try {
			Class.forName(this.sterownik).newInstance();
			con = DriverManager.getConnection(this.url, this.props);
			Statement st = con.createStatement();
		    ResultSet res = st.executeQuery("SELECT Sum(" + atrybut + ") suma FROM " + tabela);
		    res.next();
		    s = res.getInt("suma");
		} catch (Exception e) {
			;
		}
		return s;
	}
	
	public int obliczSrednia(String atrybut, String tabela){
		int s = 0;
		Connection con = null;
		try {
			Class.forName(this.sterownik).newInstance();
			con = DriverManager.getConnection(this.url, this.props);
			Statement st = con.createStatement();
		    ResultSet res = st.executeQuery("SELECT AVG(" + atrybut + ") srednia FROM " + tabela);
		    res.next();
		    s = res.getInt("srednia");
		} catch (Exception e) {
			;
		}
		return s;
	}
	
	public int obliczIlosc(String tabela){
		int c = 0;
		Connection con = null;
		try {
			Class.forName(this.sterownik).newInstance();
			con = DriverManager.getConnection(this.url, this.props);
			Statement st = con.createStatement();
		    ResultSet res = st.executeQuery("SELECT COUNT(id) ilosc FROM " + tabela);
		    res.next();
		    c = res.getInt("ilosc");
		} catch (Exception e) {
			;
		}
		return c;
	}
	
	public void podlaczDoBazy(){
		try {
			Class.forName(this.sterownik).newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(this.url, this.props);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void aktualizujBaze(String polecenie){
		Connection con = null;
		try{
			Class.forName(this.sterownik).newInstance();
			con = DriverManager.getConnection(this.url, this.props);
		}catch(Exception ex){
			javax.swing.JOptionPane.showMessageDialog
				(null, "Baza nie odpowiada!!", 
				"Blad", JOptionPane.WARNING_MESSAGE);
			return;
		}
		try{
		Statement st = con.createStatement();
		st.executeUpdate(polecenie);
		con.close();
		/*javax.swing.JOptionPane.showMessageDialog
			(null, "Operacja wykonana prawid�owo.", 
			"Komunikat", JOptionPane.WARNING_MESSAGE);*/
			System.out.println("Operacja wykonana prawidlowo.");
		}catch(Exception ex){
			/*javax.swing.JOptionPane.showMessageDialog
				(null, "Podane z�e dane!!", 
				"B��d", JOptionPane.WARNING_MESSAGE);*/
			System.out.println("Podane zle dane!!");
			return;
		}
	}
	
	public Vector stworzListe(String encja){
		Connection con = null;
		try{
			Class.forName(this.sterownik).newInstance();
			con = DriverManager.getConnection(this.url, this.props);
			Statement st = con.createStatement();
		    ResultSet res = st.executeQuery("SELECT * FROM " + encja);
		    if(encja.equals("klient")){
		    	Vector<Klient> listaKlient = new Vector<Klient>();
		    	while(res.next()){
					listaKlient.add(new Klient(res.getInt("id"), res.getString("imie"), res.getString("nazwisko"), res.getDate("data_urodzenia"), 
							res.getString("miasto"), res.getString("wojewodztwo"), res.getString("email"), res.getString("plec"), res.getString("stan_cywilny"),
							res.getInt("liczba_dzieci"), res.getString("wyksztalcenie"), res.getString("zawod"), res.getInt("dochod"), res.getInt("oszczednosci_msc"),
							res.getString("mieszkanie"), res.getString("kategoria")));
		    	}
		    	con.close();
		    	return listaKlient;
		    }else if(encja.equals("lokata")){
		    	Vector<Lokata> listaLokata = new Vector<Lokata>();
		    	while(res.next()){
		    		listaLokata.add(new Lokata(res.getLong("id"), res.getString("nazwa"), res.getDouble("oprocentowanie"), res.getInt("okres_trwania"), 
							res.getString("kapitalizacja"), res.getInt("minimalna_kwota")));
		    	}
		    	con.close();
		    	return listaLokata;
		    }else if(encja.equals("kredyt")){
		    	Vector<Kredyt> listaKredyt = new Vector<Kredyt>();
		    	while(res.next()){
		    		listaKredyt.add(new Kredyt(res.getInt("id"), res.getInt("oprocentowanie"), res.getInt("ilosc_miesiecy")));
		    	}
		    	con.close();
		    	return listaKredyt;
		    }else if(encja.equals("konto")){
		    	Vector<Konto> listaKonto = new Vector<Konto>();
		    	while(res.next()){
		    		listaKonto.add(new Konto(res.getLong("id"), res.getLong("id_klienta"), res.getInt("saldo_pocz"), res.getInt("saldo_aktualne"), 
							res.getString("typ_konta"), res.getDate("data_otwarcia")));
		    	}
		    	con.close();
		    	return listaKonto;
		    }else if(encja.equals("zmianaSalda")){
		    	Vector<ZmianaSalda> listaZmianaSalda = new Vector<ZmianaSalda>();
		    	while(res.next()){
		    		listaZmianaSalda.add(new ZmianaSalda(res.getLong("id_konta"), res.getInt("kwota_zmiany"), res.getDate("data")));
		    	}
		    	con.close();
		    	return listaZmianaSalda;
		    }else if(encja.equals("kredytKlienta")){
		    	Vector<KredytKlienta> listaKredytKlienta = new Vector<KredytKlienta>();
		    	while(res.next()){
		    		listaKredytKlienta.add(new KredytKlienta(res.getInt("id"), res.getInt("id_klienta"), res.getInt("id_kredytu"), res.getDouble("kwota"), 
							res.getDate("data"), res.getString("typ")));
		    	}
		    	con.close();
		    	return listaKredytKlienta;
		    }else if(encja.equals("splata")){
		    	Vector<Splata> listaSplata = new Vector<Splata>();
		    	while(res.next()){
		    		listaSplata.add(new Splata(res.getInt("id"), res.getInt("id_kredytu_klienta"), res.getDouble("kwota"), res.getDate("data")));
		    	}
		    	con.close();
		    	return listaSplata;
		    }else if(encja.equals("lokataKlienta")){
		    	Vector<LokataKlienta> listaLokataKlienta = new Vector<LokataKlienta>();
		    	while(res.next()){
		    		listaLokataKlienta.add(new LokataKlienta(res.getLong("id"), res.getLong("id_klienta"), res.getLong("id_lokaty"), res.getInt("kwota"), 
							res.getString("typ"), res.getDate("data_utworzenia")));
		    	}
		    	con.close();
		    	return listaLokataKlienta;
		    }
		    con.close();
		}catch(Exception ex){
			javax.swing.JOptionPane.showMessageDialog
				(null, "Baza nie odpowiada!!", 
				"Bladd", JOptionPane.WARNING_MESSAGE);
			return null;
		}
		return null;
	}
	
}
